#coding:utf8
"""
当我们登录的时候,我们需要将cookie数据合并到Redis中


cookie :  {sku_id:{count:xxx,selected:xxxx}}


redis: hash     {sku_id:count}
        set     {sku_id,sku_id}


把抽象的事物具体化
1.获取cookie数据
cookie:     {1:{count:10,selected:True},3:{count:30:selected:False}}

2.获取redis数据 (只获取hash数据)
    # 选中的id,我们用一个容器单独去记录
redis:
        hash:   {2:20,3:300}
        set:    {2}
3.合并
分析,cookie数据和redis数据合并的业务逻辑:

    cookie数据无外乎就是 sku_id,count,selected

    1. cookie中的存在的商品id, redis中不存在, 将 cookie 中的商品id,添加进来
    2. cookie中的存在的商品id, redis中也存在, 商品数量怎么办. 我们以cookie为主

########合并的数据###############
4. 需要将合并的数据 添加到redis中
hash   {2:20,3:300,1:10,3:30}
set     {1}


5.删除cookie数据

1.获取cookie数据
2.获取redis数据 (只获取hash数据)
    # 选中的id,我们用一个容器单独去记录
3.合并
4. 需要将合并的数据 添加到redis中
5.删除cookie数据
"""
import base64
import pickle

from django_redis import get_redis_connection


def merge_cookie_to_redis(request,user,response):
    # 1.获取cookie数据
    cookie_str = request.COOKIES.get('cart')

    if cookie_str is not None:

        cookie_cart = pickle.loads(base64.b64decode(cookie_str))
        # {1:{count:5,selected:True},3:{count:5,selected:False}}

        # 2.获取redis数据 (只获取hash数据)
        redis_conn = get_redis_connection('cart')

        # request.user
        sku_count = redis_conn.hgetall('cart_%s'%user.id)
        # hash {b'1':b'3',b'2':b'5'}
        # 最好对hash数据进行处理
        redis_cart = {}
        for sku_id,count in sku_count.items():
            redis_cart[int(sku_id)] = int(count)

        #     # 选中的id,我们用一个容器单独去记录
        selected_ids = []
        # 3.合并 需要对 cookie数据进行遍历
        # {1:{count:5,selected:True},3:{count:5,selected:False}}
        for sku_id,count_selected_dict in cookie_cart.items():

            # 判断 sku_id 是否在redis_cart
            # if sku_id in redis_cart:
            #     redis_cart[sku_id]=count_selected_dict['count']
            # else:
            #     redis_cart[sku_id]=count_selected_dict['count']

            redis_cart[sku_id] = count_selected_dict['count']

            # 判断选中状态
            if count_selected_dict['selected']:
                selected_ids.append(sku_id)

        # 4. 需要将合并的数据 添加到redis中

        # redis_cart    最新的合并数据
        # {16:5,2:10}
        redis_conn.hmset('cart_%s'%user.id,redis_cart)

        # selected_ids 新增的选中的id
        # 添加到集合中
        # [1,2,3,4]
        # redis_conn.sadd('cart_selected_%s'%user.id,*selected_ids)
        if len(selected_ids) > 0:
            redis_conn.sadd('cart_selected_%s'%user.id,*selected_ids)


        # 5.删除cookie数据
        response.delete_cookie('cart')

        return response

    return response
